package lambda;

/**
 * @author deity
 * @version 1.0
 * @date 2020/11/7 18:57
 */
public class App {


    public static void main(String[] args) {
        /**
         * 1-Lambda表达式的基本语法
         *  (1)声明： 就是和 Lambda 表达式绑定的接口类型
         *  (2)参数： 包含在一对圆括号中，和绑定的接口中的抽象方法中的参数个数及顺序一致
         *  (3)操作符号： ->
         *  (4)执行代码块： 包含在一对大括号中，出现在操作符号的右侧
         *
         *   [接口声明] = (参数)->{执行代码块};
         *
         * 2-Lambda表达式，必须和接口进行绑定
         * 3-Lambda表达式的参数，可以附带0个到n个参数，括号中的参数类型可以不用指定，JVM在运行时，会自动根据绑定的抽象方法中参数自行推导
         * 4-Lambda表达式的返回值，如果代码块只有一行，并且没有大括号，不用写return关键字，单行代码的执行结果，会自动返回
         *          如果添加了大括号，或者有多行代码，必须通过return关键字返回执行结果
         */
        ILambda1 i1 = () -> {
            System.out.println("无参数，无返回值的Lambda表达式。");
        };
        i1.test();

        ILambda1 i2 = () -> System.out.println("只有一行代码的简写方式");
        i2.test();

        ILambda2 i21 = (name, age) -> System.out.println(name + " say: my year's old is " + age);
        i21.test("Celia", 19);

        ILambda3 i31 = (x, y) -> {
            return x + y;
        };
        System.out.println(i31.test(13, 14));
        //如果只有一行代码,可以省略 return 关键字
        ILambda3 i32 = (x, y) -> x + y;
        System.out.println(i32.test(33,44));

    }

    // 1-没有参数，没有返回值的Lambda表达式绑定的接口
    interface ILambda1 {
        void test();
    }

    // 2-带有参数，没有返回值的Lambda表达式
    interface ILambda2 {
        void test(String name, int age);
    }

    // 3-带有参数和返回值的Lambda表达式
    interface ILambda3 {
        int test(int x, int y);
    }

}
